package qgs.zisu.javaconcurrency.javaconcurrency.chapter7_synchronized;

/**
 * @Author: 蔡翔
 * @Date: 2019/10/11 14:06
 * @Version 1.0
 *
 * 出现的问题：多个线程 同时访问同一个资源的时候，这个资源可能在多个线程中出现 不同步问题
 * 解决方案：给这个”资源“ 加锁，保证所有资源一次性 只能由一个线程访问。
 */
public class SynchronizedThis {
    public static void main(String[] args) {
        // 定义一个锁。
        ThisLock thisLock = new ThisLock();

        // 当m1 和 m2;一个加了锁，一个没加锁。 那么是同时输出T1、 T2的
        // 当m1 和 m2;都加上了锁。那就看T1/T2 线程谁先抢到资源了。 因为m1 和 m2 上的是同一把锁。一把锁只有一个钥匙 就先看谁拿到钥匙了。


        new Thread("T1"){
            @Override
            public void run() {
                thisLock.m1();
            }
        }.start();


        new Thread("T2"){
            @Override
            public void run() {
                thisLock.m2();
            }
        }.start();


    }
}

class ThisLock{
    // 如果 给m1 和m2 上的不是一把锁，那么m1和m2 两方法是 同时执行的。
    // 锁 可以用你自己定义的锁定义一个final类型的Object 锁。也可以用类锁（ThisLock）--直接就是synchronized 加在方法上


    private final Object LOCK = new Object();
    public void m1(){
        try {
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(10_000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void m2(){
        synchronized (LOCK){
            try {
                System.out.println(Thread.currentThread().getName());
                Thread.sleep(10_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}